// 解题思路：
// 第一步：建图
// 统计每个点的入度信息
// 统计每个点的边的信息
// 第二步：
// 建立队列，把入度为 0 的点存起来
// 第三步：排序
// 拿出队头元素
// 修改队头元素连接的点的信息（入度）
// 判断如果入度为 0，加入队列
// 第四步：返回结果
// 如果节点数量和原来的节点数量一致，说明可以拓扑排序
import java.util.*;
import java.io.*;

public class TopoSort {
    public static Read in = new Read();
    public static void main(String[] args) throws IOException{
        int n = in.nextInt();
        int m = in.nextInt();
        int[] inP = new int[n + 1];
        Map<Integer, ArrayList<Integer>> hash = new HashMap<>();
        // 1. 建图
        while(m-- > 0){
            int a = in.nextInt();
            int b = in.nextInt();
            // 入度
            inP[b]++;
            // 出度/邻接表
            if(!hash.containsKey(a)){
                hash.put(a, new ArrayList<>());
            }
            hash.get(a).add(b);
        }
        // 2. 所有入度为 0 的点加入队列
        Queue<Integer> queue = new LinkedList<>();
        for(int i = 1; i <= n; i++){
            if(inP[i] == 0) queue.offer(i);
        }
        // 3. 拓扑排序
        List<Integer> ret = new ArrayList<>();
        while(!queue.isEmpty()){
            int tmp = queue.poll();
            ret.add(tmp);
            for(int x : hash.getOrDefault(tmp, new ArrayList<>())){
                inP[x]--;
                if(inP[x] == 0) queue.offer(x);
            }
        }
        // 4. 返回结果
        if(ret.size() < n) {
            System.out.println(-1);
            return;
        }

        for(int i = 0; i < n; i++) {
            System.out.print(ret.get(i));
            if(i != n - 1){
                System.out.print(" ");
            }
        }
    }
}

class Read{
    StringTokenizer st = new StringTokenizer("");
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

    String next() throws IOException{
        while(!st.hasMoreTokens()){
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }

    int nextInt() throws IOException{
        return Integer.parseInt(next());
    }
}
